Things the FMA will do for the FMS:

When an FMA starts up, it establishes a link with the FMS, and sends a
message indicating the number of myrinet interfaces detected, the MAC
addresses of each, and the SW version being run on the node.

The FMS will send the map of the fabric to each FMA.  The FMS will 
instruct the FMA to send probes to test specific links and to test specific
hosts.  [is the route specified or up to the FMA??]  There will also be
probes to test for "no-connect". [maybe 3 distinct different anti-probe types
to look for, respectively, hosts, xbar16s, and xbar32s.]

Each type of probe has a timeout duration and a retry count.  The FMA will have
a list of currently active probes which it cycles through continuously. It
will also have a cycle time specified by the FMS which governs how rapidly new
probes are started.  Probes will be spread as uniformly through the cycle
time as possible.

Probes can either be OK, failed, or untested.  Failures can be either timed out
or wrong response.  If a probe is wrong response, the type and ID of the 
responder are reported.

Failed probes are reported to the FMS as soon as they are detected.  When
a probe cycle is complete, a message is sent to the FMS indicating the number
of failed probes during the cycle. [later, this message may be sent to a
"parent" FMA to propagate results up to the FMS] [actually, the number may
be superfluous]




Myri message types:
 raw:
  set a route on a remote node
  send a probe to a host
  send a probe to a specific port on an xbar (16 / 32)
 reliable:
  encapsulate a message to another FMA

int mi_open() - returns a file descriptor which you can select on or whatever.  a single byte is written to this file descriptor when there is an event (it's really just a pipe, probably)

mi_close(int)

mi_send(mac_addr_t dest, int key, void *buffer, int len); - execute a reliable send, key is 0..16 for matching

mi_raw_send(int ifc, void *route, int route_len, void *buffer, int len);

mi_recv(int key, char *buf, int len); - specify a buffer for a raw receive.  key is 0..16 for rudimentary matching

mi_get_next_event() - returns immdiately with send_complete, raw_send_complete, recv_complete, raw_recv_complete, or no_event.  a handle is used to identify which send. this always returns immediately, there is no timeout.  This call consumes the byte written to the pipe from mi_open, which you really don't need to care about.

mi_get_recv(void **buffer, int *len) - this returns a pointer and length of message most recently reported as event  (maybe smurge this back into get_next_event() - not sure yet)


-----------
multi-FMS support

each FMA has a list of servers to which to attempt to connect.  it just tries
them in order until someone answers.  if connected 
